#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<string.h>

#define NUM 1024
#define SIZE 128
#define SEP " "


char *command_args[SIZE]; 
char command_line[NUM];
char env_buffer[NUM];

extern char** environ;

int ChangeDir(const char * new_path)
{
  chdir(new_path);//改变路径的系统调用接口
  
  return 0;
}

void PutEnvInMyShell(char * new_env)
{
    setenv(new_env);
}


int main()
{
  while(1)
  {
    printf("[bcq@我的主机 当前目录]# ");
    fflush(stdout);

    memset(command_line, '\0', sizeof(command_line)*sizeof(char));
    fgets(command_line, NUM, stdin);    //获取输入的命令
    
    command_line[strlen(command_line)-1] = '\0';//清除换行（'\n'）
    //printf("%s\n", command_line);
    
    command_args[0] = strtok(command_line, SEP);//按标识符分割命令
    
    int index = 1;
    if(strcmp(command_args[0], "ls") == 0)      //命令行前置处理
      command_args[index++] = (char*)"--color=auto";
    
    //内建命令(必须由父shell执行)
    if(strcmp(command_args[0], "cd") == 0 && command_args[1] != NULL)
    {
      ChangeDir(command_args[1]);
      continue;
    }

    if(strcmp(command_args[0], "export") == 0 && command_args[1] != NULL)
    {
      // 目前，环境变量信息在command_line,会被清空
      // 此处我们需要自己保存一下环境变量内容
      strcpy(env_buffer, command_args[1]);
      
      //PutEnvInMyShell(command_args[1]);
      PutEnvInMyShell(env_buffer); //export myval=100, BUG?
      continue;
    }
    
    //开始分割
    while(command_args[index++] = strtok(NULL, SEP));

    //创建（子）进程，执行命令
    pid_t id = fork();
    if(id == 0)
    {
        //程序替换
        execvp(command_args[0], command_args);
        exit(1);
    }
    int status = 0;
    pid_t ret = waitpid(id, &status, 0);
    if(ret > 0)
    {
      printf("ok\n");
    }

  }
  
  return 0;
}
























